/**
 * 错误消息映射工具
 * 将技术错误代码转换为用户友好的提示信息
 */

/**
 * HTTP状态码对应的友好提示
 */
export const httpStatusMessages = {
  400: '请求参数有误，请检查输入内容',
  401: '您还未登录，请先登录',
  403: '抱歉，您没有权限进行此操作',
  404: '请求的资源不存在',
  409: '该信息已存在，请勿重复提交',
  422: '提交的数据格式不正确',
  429: '您的操作过于频繁，请稍后再试',
  500: '服务器出现了一点问题，请稍后重试',
  502: '服务器连接失败，请稍后重试',
  503: '服务暂时不可用，请稍后重试',
  504: '服务器响应超时，请稍后重试',
};

/**
 * 业务错误代码对应的友好提示
 */
export const businessErrorMessages = {
  // 用户相关
  'USERNAME_EXISTS': '这个用户名已经被使用了，换一个试试吧',
  'USER_NOT_FOUND': '用户不存在，请检查用户名是否正确',
  'INVALID_PASSWORD': '密码不正确，请重新输入',
  'WEAK_PASSWORD': '密码强度不够，请设置更复杂的密码',
  'INVALID_INPUT': '输入信息有误，请检查后重试',
  'TOKEN_EXPIRED': '登录已过期，请重新登录',
  'UNAUTHORIZED': '您还没有登录，请先登录',
  
  // 作文相关
  'ESSAY_NOT_FOUND': '找不到这篇作文',
  'ESSAY_TOO_LONG': '作文内容太长了，请精简一些',
  'ESSAY_TOO_SHORT': '作文内容太短了，请多写一些',
  'INVALID_GRADE_LEVEL': '请选择正确的学段',
  
  // 文件相关
  'FILE_TOO_LARGE': '文件太大了，请选择小一点的文件',
  'INVALID_FILE_TYPE': '文件格式不支持，请选择图片文件',
  'UPLOAD_FAILED': '文件上传失败，请重试',
  
  // 批改相关
  'CORRECTION_FAILED': '批改失败，请稍后重试',
  'AI_SERVICE_ERROR': 'AI服务暂时不可用，请稍后重试',
  
  // 通用错误
  'NETWORK_ERROR': '网络连接失败，请检查您的网络',
  'UNKNOWN_ERROR': '出现了未知错误，请稍后重试',
  'VALIDATION_ERROR': '数据验证失败，请检查输入',
};

/**
 * 网络错误对应的友好提示
 */
export const networkErrorMessages = {
  'ERR_NETWORK': '网络连接失败，请检查网络设置',
  'ERR_CONNECTION_REFUSED': '无法连接到服务器，请稍后重试',
  'ERR_CONNECTION_TIMEOUT': '连接超时，请检查网络后重试',
  'ERR_BAD_REQUEST': '请求格式错误，请刷新页面重试',
  'ERR_CANCELED': '请求已取消',
  'ECONNABORTED': '请求超时，请稍后重试',
};

/**
 * 表单验证错误提示
 */
export const validationMessages = {
  required: '这是必填项',
  minLength: (min) => `至少需要${min}个字符`,
  maxLength: (max) => `最多${max}个字符`,
  email: '请输入有效的邮箱地址',
  phone: '请输入有效的手机号码',
  password: '密码必须包含字母和数字，长度6-20位',
  username: '用户名只能包含字母、数字和下划线，长度3-20位',
  match: '两次输入不一致',
};

/**
 * 获取友好的错误提示
 * @param {Error|Object} error - 错误对象
 * @returns {string} 友好的错误提示
 */
export function getFriendlyErrorMessage(error) {
  // 如果已经是友好消息，直接返回
  if (typeof error === 'string' && !error.includes('Error')) {
    return error;
  }

  // 处理HTTP状态码错误
  if (error?.status || error?.response?.status) {
    const status = error.status || error.response.status;
    if (httpStatusMessages[status]) {
      return httpStatusMessages[status];
    }
  }

  // 处理业务错误代码
  if (error?.code || error?.error?.code || error?.response?.data?.code) {
    const code = error.code || error.error?.code || error.response?.data?.code;
    if (businessErrorMessages[code]) {
      return businessErrorMessages[code];
    }
  }

  // 处理网络错误
  if (error?.code && networkErrorMessages[error.code]) {
    return networkErrorMessages[error.code];
  }

  // 处理axios错误
  if (error?.message?.includes('Network Error')) {
    return networkErrorMessages['ERR_NETWORK'];
  }
  if (error?.message?.includes('timeout')) {
    return networkErrorMessages['ECONNABORTED'];
  }

  // 处理后端返回的消息
  if (error?.response?.data?.message) {
    const backendMessage = error.response.data.message;
    // 如果后端消息已经很友好，直接使用
    if (backendMessage.length < 50 && !backendMessage.includes('Error')) {
      return backendMessage;
    }
  }

  // 处理error对象的message
  if (error?.message) {
    // 尝试匹配已知错误模式
    const message = error.message.toLowerCase();
    if (message.includes('network')) {
      return networkErrorMessages['ERR_NETWORK'];
    }
    if (message.includes('timeout')) {
      return networkErrorMessages['ECONNABORTED'];
    }
    if (message.includes('cors')) {
      return '跨域请求被阻止，请联系管理员';
    }
    if (message.includes('not found')) {
      return httpStatusMessages[404];
    }
    if (message.includes('unauthorized')) {
      return httpStatusMessages[401];
    }
    if (message.includes('forbidden')) {
      return httpStatusMessages[403];
    }
  }

  // 默认错误消息
  return '操作失败，请稍后重试';
}

/**
 * 获取表单验证错误提示
 * @param {string} rule - 验证规则
 * @param {*} value - 参数值
 * @returns {string} 验证错误提示
 */
export function getValidationMessage(rule, value) {
  if (typeof validationMessages[rule] === 'function') {
    return validationMessages[rule](value);
  }
  return validationMessages[rule] || '输入格式不正确';
}

/**
 * 在控制台中记录错误（开发环境）
 * @param {string} context - 错误上下文
 * @param {Error} error - 错误对象
 */
export function logError(context, error) {
  if (import.meta.env.DEV) {
    console.error(`[${context}]`, {
      message: error?.message,
      code: error?.code,
      status: error?.status || error?.response?.status,
      data: error?.response?.data,
      error,
    });
  }
}

/**
 * 显示友好的错误提示（可扩展为toast/notification）
 * @param {Error|Object|string} error - 错误对象或消息
 * @param {string} context - 错误上下文（可选）
 * @returns {string} 友好的错误消息
 */
export function showError(error, context = '') {
  const message = getFriendlyErrorMessage(error);
  
  // 记录到控制台（开发环境）
  if (context && import.meta.env.DEV) {
    logError(context, error);
  }
  
  // TODO: 这里可以集成toast/notification组件
  // toast.error(message);
  
  return message;
}

export default {
  getFriendlyErrorMessage,
  getValidationMessage,
  showError,
  logError,
  httpStatusMessages,
  businessErrorMessages,
  networkErrorMessages,
  validationMessages,
};

